package com.css.casualties.controller;

import com.alibaba.fastjson.JSON;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.css.casualties.service.CasualtiesService;
import com.css.casualties.service.RyswModelService;
import com.css.exception.CommonResult;
import com.css.exception.GlobalErrorCodeConstants;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
import java.util.Set;

/**
 * @author Dbj
 * @date 2024年09月18日  12:15
 */
@RestController
@RequestMapping("/rysw")
@CrossOrigin
@Slf4j
public class CasualtiesModelController {

    @Resource
    RyswModelService ryswModelService;
    @Resource
    CasualtiesService casualtiesService;

    /**
     * 人员伤亡模型默认内置一条模型数据且有且只有一条数据，所以不存在保存之说，只有在默认内置的数据基础上修改。
     */
    @PostMapping("/update")
    public CommonResult update(@RequestBody Map<String,Object> map,HttpServletRequest request) {
        String code = request.getHeader("divisionCode");
        String divisionCode = code.split("_")[0];
        String userId = code.split("_")[1];
        Set<String> keySet = map.keySet();
        StringBuilder msg = new StringBuilder();
        if(keySet.size()<5){
            if(!keySet.contains("model1")){
                msg.append("模型1、");
            }
            if(!keySet.contains("model2")){
                msg.append("模型2、");
            }
            if(!keySet.contains("model3")){
                msg.append("模型3、");
            }
            if(!keySet.contains("model4")){
                msg.append("模型4、");
            }
            if(!keySet.contains("model5")){
                msg.append("模型5、");
            }
        }
        if (msg.length()>0) {
            String subStr = msg.substring(0, msg.lastIndexOf("、"));
            throw new RuntimeException("保存失败,请维护"+subStr+"数据");
        }
        try{
            // 切换到省份数据源
            DynamicDataSourceContextHolder.push("province_"+divisionCode);
            ryswModelService.updateRyswModelData(map,divisionCode,userId);
        }catch (Exception e){
            e.printStackTrace();
            return CommonResult.error("模型保存失败");
        }finally {
            DynamicDataSourceContextHolder.clear();
        }
        return CommonResult.success("模型保存成功");
    }

    /**
     * 人员伤亡模型信息详情
     */
    @GetMapping("/details")
    public CommonResult details(HttpServletRequest request){
        String code = request.getHeader("divisionCode");
        String divisionCode = code.split("_")[0];
        try{
            // 切换到省份数据源
            DynamicDataSourceContextHolder.push("province_"+divisionCode);
            return CommonResult.success(ryswModelService.details());
        }catch (Exception e){
            e.printStackTrace();
            CommonResult error = CommonResult.error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode());
            error.setMsg("系统内部发生异常");
            return error;
        } finally {
            DynamicDataSourceContextHolder.clear();
        }
    }

    /**
     * 计算并生成产品
     */
    @PostMapping("/rebuild")
    public CommonResult rebuild(@RequestBody Map<String,Object> map, HttpServletRequest request){
        String earthQuakeId = map.get("earthQuakeId").toString();
        //地震类型
        String type = map.get("type").toString();
        //影响场版本
        String version = map.get("version").toString();
        try{
            log.error("地震id"+earthQuakeId+"-- 计算并生成产品"+"|| 开始。>> 参数:"+ JSON.toJSONString(map));
            String msg = casualtiesService.rebuild(earthQuakeId,type,version,request);
            log.error("地震id"+earthQuakeId+"-- 计算并生成产品"+"|| 成功。>> 参数:"+ JSON.toJSONString(map));
            return CommonResult.success(200,"".equals(msg)?"计算并生成产品成功":"");
        }catch (Exception e){
            e.printStackTrace();
            log.error("地震id"+earthQuakeId+"-- 计算并生成产品"+"|| 失败。>> 参数:"+ JSON.toJSONString(map));
            CommonResult error = CommonResult.error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode());
            error.setMsg("系统内部发生异常");
            return error;
        }

    }
}
